/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package servidormeteorologico;

import Modelo.Datos;
import conexion.ConexionBD;
import conexion.datos_DAO;
import java.io.*;
import java.net.*;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import nanoxml.XMLElement;

/**
 *
 * @author dayana
 */
public class hiloServidor extends Thread {

    Socket socket = null;

    public hiloServidor(Socket socket) {
        super("hiloServidor");
        this.socket = socket;
    }

    public void run() {

        String fromAcom = "";		 // Representa el mesaje a escribir en com
        PrintWriter out = null;
        BufferedReader in = null;
        String Respuesta = null;

        int buffer = 8000;
        int count = 0; //Cuenta cuantos bytes se han leido
        InputStream entrada = null;
        String fichero = "salida.txt";
        List<Datos> lista = new ArrayList<Datos>();
        Iterator it = null;
        Datos fila = null;


        System.out.println("..Conexion Id:" + this.getId() + " aceptada.");

        try {
            out = new PrintWriter(socket.getOutputStream(), true);
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

            // Si el user y el pass son correctos
            fromAcom = in.readLine();
            System.err.println("Autenticacion " + fromAcom + "\n");

            if (Autenticar(fromAcom)) {
                out.println("Permiso Garantizado");

                //Recibimos los archivos xml
                entrada = socket.getInputStream();
                while (entrada != null) {
                    File f = new File(fichero);
                    OutputStream sin = new FileOutputStream(f);
                    int n = entrada.available(); //Num de bytes que pueden ser leidos sin bloqueo
                    byte buf[] = new byte[buffer];
                    while ((n = entrada.read(buf)) >= 0) {
                        sin.write(buf, 0, n);
                        System.out.println("bytes recibidos " + n);
                        count = count + n;

                        if (count >= 800) {
                            count = 0;
                            break;
                        }
                    }
                    try {
                        this.sleep(5000);
                    } catch (InterruptedException ex) {
                        Logger.getLogger(hiloServidor.class.getName()).log(Level.SEVERE, null, ex);
                    }
                    if (entrada != null) {
 
                        lista = obtenerDatos(fichero);
                        it = lista.iterator();

                        while (it.hasNext()) {
                            fila = (Datos) it.next();
                            Respuesta = datos_DAO.AlmacenarDatos(fila);
                            // se imprime la respuesta
                            System.out.println("Respuesta: " + Respuesta);

                            if (Respuesta.equals("fallo")) {
                                break;
                            }

                        }

                        //Le indicamos al programa en android que hemos recibido el archivo
                        out.println(Respuesta);
                    }
                }
           
            } else {
                out.println("Permiso Denegado");
            }
        } catch (IOException e) {
            System.out.println("**ERROR**: " + e);
        }

        try {
            entrada.close();
            out.close();
            in.close();
            socket.close();
        } catch (IOException e) {
            System.out.println("**ERROR** no se puede cerrar la conexion: " + e);
        }


        System.out.println("..Conexion Id:" + this.getId() + " cerrada.");

    }

    public static boolean Autenticar(String fila) {
        StringTokenizer st = new StringTokenizer(fila, " ");
        int i = 0;
        String user = "";
        String pass = "";

        while (st.hasMoreElements()) {
            String token = st.nextElement().toString();

            if (i == 0) {
                user = token;
            } else {
                pass = token;
            }
            i++;
        }

        boolean valido = datos_DAO.Autenticar(user, pass);
        System.out.println("USER Pass: " + fila + " valido: " + valido);
        return valido;
    }

    static List<Datos> obtenerDatos(String archivo) {
        XMLElement xml = new XMLElement();
        FileReader reader = null;
        try {
            reader = new FileReader(archivo);
            xml.parseFromReader(reader);
        } catch (Exception e) {
        }
        String fecha = null;
        String hora = null;
        String dato;
        String value;
        int i = 0;
        Datos dat = new Datos();
        List<Datos> lista = new ArrayList<Datos>();

        Enumeration enu = xml.enumerateChildren();

        while (enu.hasMoreElements()) {
            XMLElement child = (XMLElement) enu.nextElement();

            Enumeration enu2 = child.enumerateChildren();
            dat = new Datos();
            while (enu2.hasMoreElements()) {
                XMLElement child2 = (XMLElement) enu2.nextElement();

                dato = child2.getName();
                value = child2.getContent();

                if (dato.compareTo("fecha") == 0) {
                    fecha = value.replaceAll("_", "/");

                } else if (dato.compareTo("hora") == 0) {
                    hora = value.replaceAll("-", ":");

                } else if (dato.compareTo("temperatura") == 0) {
                    dat.setTemperatura(Double.parseDouble(value));
                } else if (dato.compareTo("humedad") == 0) {
                    dat.setHumedad(Double.parseDouble(value));
                } else if (dato.compareTo("viento") == 0) {
                    dat.setViento(Double.parseDouble(value));
                } else if (dato.compareTo("presion") == 0) {
                    dat.setPresionAtm(Double.parseDouble(value));
                } else if (dato.compareTo("precipitacion") == 0) {
                    dat.setPrecipitacion(Double.parseDouble(value));
                    dat.setFecha(fecha);
                    dat.setHora(hora);
                    lista.add(dat);
                }
            }
        } //fin del while mas grande

        try {
            reader.close();
        } catch (IOException ex) {
            System.out.println("Excepcion: " + ex);
        }
        return lista;
    }//fin obtener datos
}
